package com.oracle.lingshangejia.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 与时间有关的工具类
 */

public class TimeUtils {
    /**
     * @return 返回10位的时间戳
     */
    public static String getTime() {
        long time=System.currentTimeMillis();//获取系统时间的10位的时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS",
                Locale.getDefault());//"yyyyMMddHHmmssSSS"
        String format = sdf.format(time);
//        String  str=String.valueOf(time);
        return format;
    };

    public static  String getTimeToday() {
        long time=System.currentTimeMillis();//获取系统时间的10位的时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年_MM月_dd日",
                Locale.getDefault());//"yyyyMMddHHmmssSSS"
        String format = sdf.format(time);
//        String  str=String.valueOf(time);
        return format;
    }
    /**
     * @return  获取当前的时间戳
     */
    public static long getCurrentStamp() {
        return System.currentTimeMillis();
    }

    /**
     * @return   获取当前日期和时间
     */
    public static String getTodayDateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
                Locale.getDefault());
        return format.format(new Date());
    }

    /**
     * @return 获取当前日期
     */
    public static String getTodayDate() {
        SimpleDateFormat format = new SimpleDateFormat("MM月dd日",
                Locale.getDefault());
        return format.format(new Date());
    }

    /**
     * @return 按格式获取当前日期
     */
    public static String getTodayDate(String formatString) {
        SimpleDateFormat format = new SimpleDateFormat(formatString,
                Locale.getDefault());
        return format.format(new Date());
    }



    /**
     * 根据时间（"2014年06月14日16时09分00秒"）获取时间戳,时间格式可以灵活变动
     *
     * @param time
     * @return
     */
    public static long time2stamp(String time) {
        //2017-09-25 10:54:36
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
                Locale.CHINA);
        Date date;
        long l = 0;
        try {
            date = sdr.parse(time);
            l = date.getTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return l;
    }


    /**
     * @param time  时间戳
     * @return  时间戳对应的时间
     */
    public static String time(long time) {
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        long lcc = Long.valueOf(time);
        String times = sdr.format(new Date(lcc));
        return times;
    }

    /**
     * @param date Date对象
     * @return  时间
     */
    public static String date2time(Date date) {
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd   HH:mm");
        return sdr.format(date);
    }

    public static String date2date(Date date) {
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd");
        return sdr.format(date);
    }

    /**
     * 知道连个时间的时间戳,算出两个时间的差
     * @param stamp1  前一个时间戳
     * @param stamp2  后一个时间戳
     * @return   时间差
     */
    public static String stamp2TimeDifference (long stamp1,long stamp2) {
        long stamp = stamp2 -stamp1;
        int dayNum = (int) (stamp/(1000 * 60 * 60 * 24));
        int stampInDay = (int) (stamp - dayNum * (1000 * 60 *60 * 24));//1天中还有多少时间没算
        int hourNum = stampInDay /(1000 * 60 * 60);
        int stampInHour = stampInDay - hourNum * (1000 * 60 *60);//1小时中还有多少时间没算
        int minuteNum = stampInHour/ (1000 * 60);
        if (dayNum != 0) {
            return dayNum + "天" + hourNum + "小时" + minuteNum + "分";
        } else if (hourNum != 0) {
            return hourNum + "小时" + minuteNum + "分";
        } else  {
            return minuteNum + "分";
        }
    }

    /**
     * 将long时间转成yyyy-MM-dd HH:mm:ss字符串<br>
     * @param timeInMillis 时间long值
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getDateTimeFromMillis(long timeInMillis) {
        return getDateTimeFormat(new Date(timeInMillis));
    }

    /**
     * 将date转成字符串
     * @param date Date
     * @param format SimpleDateFormat
     * <br>
     * 注： SimpleDateFormat为空时，采用默认的yyyy-MM-dd HH:mm:ss格式
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String dateSimpleFormat(Date date, SimpleDateFormat format) {
        if (format == null)
            format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return (date == null ? "" : format.format(date));
    }

    /**
     * 将date转成yyyy-MM-dd HH:mm:ss字符串
     * <br>
     * @param date Date对象
     * @return  yyyy-MM-dd HH:mm:ss
     */
    public static String getDateTimeFormat(Date date) {
        return dateSimpleFormat(date, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }



    /**
     * 获得HH:mm:ss的时间
     * @param date
     * @return
     */
    public static String getTimeFormat(Date date) {
        return dateSimpleFormat(date, new SimpleDateFormat("HH:mm:ss"));
    }

    /**
     * 格式化日期显示格式
     * @param sdate 原始日期格式 "yyyy-MM-dd"
     * @param format 格式化后日期格式
     * @return 格式化后的日期显示
     */
    public static String dateFormat(String sdate, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        java.sql.Date date = java.sql.Date.valueOf(sdate);
        return dateSimpleFormat(date, formatter);
    }

    /**
     * 格式化日期显示格式
     * @param date Date对象
     * @param format 格式化后日期格式
     * @return 格式化后的日期显示
     */
    public static String dateFormat(Date date, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return dateSimpleFormat(date, formatter);
    }

    /**
     * 将"yyyy-MM-dd HH:mm:ss" 格式的字符串转成Date
     * @param strDate 时间字符串
     * @return Date
     */
    public static Date getDateByDateTimeFormat(String strDate) {
        return getDateByFormat(strDate, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 将"yyyy-MM-dd" 格式的字符串转成Date
     * @param strDate
     * @return Date
     */
    public static Date getDateByDateFormat(String strDate) {
        return getDateByFormat(strDate, new SimpleDateFormat("yyyy-MM-dd"));
    }

    /**
     * 将指定格式的时间字符串转成Date对象
     * @param strDate 时间字符串
     * @param format 格式化字符串
     * @return Date
     */
    public static Date getDateByFormat(String strDate, String format) {
        return getDateByFormat(strDate, new SimpleDateFormat(format));
    }

    /**
     * 将String字符串按照一定格式转成Date<br>
     * 注： SimpleDateFormat为空时，采用默认的yyyy-MM-dd HH:mm:ss格式
     * @param strDate 时间字符串
     * @param format SimpleDateFormat对象
     * @exception ParseException 日期格式转换出错
     */
    private static Date getDateByFormat(String strDate, SimpleDateFormat format) {
        if (format == null)
            format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return format.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }        return null;
    }

    /**
     * 将年月日的int转成date
     * @param year 年
     * @param month 月 1-12
     * @param day 日
     * 注：月表示Calendar的月，比实际小1
     */
    public static Date getDate(int year, int month, int day) {
        Calendar mCalendar = Calendar.getInstance();
        mCalendar.set(year, month - 1, day);
        return mCalendar.getTime();
    }

    /**
     * 求两个日期相差天数
     *
     * @param strat 起始日期，格式yyyy-MM-dd
     * @param end 终止日期，格式yyyy-MM-dd
     * @return 两个日期相差天数
     */
    public static long getIntervalDays(String strat, String end) {
        return ((java.sql.Date.valueOf(end)).getTime() - (java.sql.Date
                .valueOf(strat)).getTime()) / (3600 * 24 * 1000);
    }

    /**
     * 获得当前年份
     * @return year(int)
     */
    public static int getCurrentYear() {
        Calendar mCalendar = Calendar.getInstance();
        return mCalendar.get(Calendar.YEAR);
    }

    /**
     * 获得当前月份
     * @return month(int) 1-12
     */
    public static int getCurrentMonth() {
        Calendar mCalendar = Calendar.getInstance();
        return mCalendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 获得当月几号
     * @return day(int)
     */
    public static int getDayOfMonth() {
        Calendar mCalendar = Calendar.getInstance();
        return mCalendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * @param date   判断这个日期是否为今天
     * @return   是否为今天
     */
    public static boolean isToday(Date date) {
        //当前时间
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        //获取今天的日期
        String nowDay = sf.format(now);
        //对比的时间
        String day = sf.format(date);
        return day.equals(nowDay);
    }



    /**
     * @param date  日期
     * @return  日期中0点0分0秒时间点
     */
    public static long getDayStart(long date) {
        Calendar calendarDay = Calendar.getInstance();
        calendarDay.setTimeInMillis(date);
        calendarDay.set(Calendar.HOUR_OF_DAY, 0);
        calendarDay.set(Calendar.MINUTE, 0);
        calendarDay.set(Calendar.SECOND, 0);
        calendarDay.set(Calendar.MILLISECOND, 0);
        return calendarDay.getTimeInMillis();
    }


    /**
     * @param date  日期
     * @return  日期中0点0分0秒时间点
     */
    public static Date getDayStart(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * @param time0   某一天的凌晨时间点
     * @param timeJudged  需要判断的时间点，
     * @return  两个时间点是否在同一天
     */
    public static boolean judgeSameDate(long time0,long timeJudged) {
        if (timeJudged > time0 && (timeJudged - time0) < 24*3600*1000) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean isInOneYear(Date date1,Date date2) {
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    }

    public static Date newDate(int year,int month,int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year,month,day);
        return calendar.getTime();
    }
}